#ifndef __SEND__
#define __SEND__

#include <my_header.h>
#define TLV_HEADER_SIZE offsetof(TLV_t, value)
#include <openssl/sha.h>

typedef enum {
    // 基本命令
    CMD_CD = 0x01,          // 改变目录
    CMD_LS = 0x02,          // 列出目录
    CMD_PWD = 0x03,         // 当前工作目录

    // 文件操作命令
    CMD_PUTS = 0x10,        // 上传文件
    CMD_GETS = 0x11,        // 下载文件
    CMD_REMOVE = 0x12,      // 删除文件
    CMD_MKDIR = 0x13,       // 创建目录
    CMD_RMDIR = 0x14,       // 删除目录

    // 大文件传输命令
    CMD_FILE_CHECK=0x18,   //检测文件是否重复
    CMD_FILE_EXISTS=0x19,    //文件重复
    CMD_FILE_START = 0x20,  // 文件传输开始
    CMD_FILE_DATA = 0x21,   // 文件数据块
    CMD_FILE_END = 0x22,    // 文件传输结束

    // 响应和错误
    CMD_RESPONSE = 0x30,    // 正常响应
    CMD_REGISTER =0x41,   //注册
    CMD_SIGNIN=0x42,  //登录
    CMD_ERROR = 0xFF        // 错误响应
} CommandType;


// TLV结构体
typedef struct {
    uint8_t type;           // 命令类型 (1字节)
    uint32_t length;        // 数据长度 (4字节)
    uint32_t id;           // id号 (4字节)
    char username[9];        //用户名
    char token[65];         //token
    char value[1024];           // 数据长度（文件？）
} TLV_t;

int send_all(int sockfd,const void *buf,size_t len);
//发送tlv
int sendTlv(int sockfd,TLV_t *tlv);
int recv_all(int sockfd,void *buf,size_t len);
//接收tlv
int recvTlv(int sockfd,TLV_t* tlv);
//计算文件hash值
int hash_count(const char *filename,char *hash_str);
//上传文件
int upload_file(int sockfd,const char *local_path);
//下载文件
int download(int sockfd, const char *local_path);
//发送hash值
int check_file_hash(int sockfd,const char *filename);

#endif
